package com.system.demo.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.Calendar;

@Service
public class JwtUtils {

    // 密钥（使用强密码，从配置中获取）
    @Value("${app.secret-key}")
    private  String secretKey;
    /**
     * 生成JWT
     * @param uid 用户ID
     * @return JWT Token
     */
    public  String generateToken(String uid, String email) {
        // 设置过期时间（例如15分钟）
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, 15);  // 设置过期时间为当前时间加 15 分钟

        return JWT.create()
                .withClaim("uid", uid)  // 用户ID
                .withClaim("email", email) // 用户邮箱
                .withExpiresAt(calendar.getTime())  // 设置过期时间
                .sign(Algorithm.HMAC256(secretKey));  // 使用密钥加密
    }

    /**
     * 解析并验证 JWT
     * @param token JWT Token
     * @return uid 和 email 如果验证通过
     * @throws JWTVerificationException 如果验证失败
     */
    public  JwtClaims verifyToken(String token) throws JWTVerificationException {
        // 创建验证器
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secretKey))
                .build();

        // 解析 token
        DecodedJWT decodedJWT = verifier.verify(token);

        // 获取 claims 中的 uid 和 email
        String uid = decodedJWT.getClaim("uid").asString();
        String email = decodedJWT.getClaim("email").asString();

        // 返回解析出的 uid 和 email
        return new JwtClaims(uid, email);
    }

    // 定义一个简单的 DTO 类来保存解析出的数据
    public static class JwtClaims {
        private String uid;
        private String email;

        public JwtClaims(String uid, String email) {
            this.uid = uid;
            this.email = email;
        }

        public String getUid() {
            return uid;
        }

        public String getEmail() {
            return email;
        }
    }
}
